import socket
import threading
from socket import AF_INET,SOCK_STREAM
import wx
class HhtClient(wx.Frame):
    def __init__(self,name):
        # None表示没有父窗体
        # id 表示窗体的编号
        # title表示窗体的标题
        # pos 表示窗体的位置
        # size表示窗体的大小 宽和长
        wx.Frame.__init__(self,None,id=1001,title=name+'的客户端',pos=wx.DefaultPosition,size=(400,500))
        #创建面板
        pl = wx.Panel(self)
        # 创建盒子 参数的垂直布局 vertical:垂直
        box = wx.BoxSizer(wx.VERTICAL)
        # 可伸缩的网格布局 水平布局
        fgz1 = wx.FlexGridSizer(wx.HSCROLL)

        #创建两个按钮
        conn_btn = wx.Button(pl,size=(200,40),label='连接')
        dis_conn_btn = wx.Button(pl,size=(200,40),label='断开')

        #将两个按钮放入网格布局中
        fgz1.Add(conn_btn,1,wx.Top|wx.LEFT)
        fgz1.Add(dis_conn_btn,1,wx.Top|wx.RIGHT)

        # 将网格布局添加到box中
        box.Add(fgz1,wx.ALIGN_CENTER)

        # 只读文本框
        self.show_text= wx.TextCtrl(pl,size=(400,280),style=wx.TE_MULTILINE|wx.TE_READONLY)
        box.Add(self.show_text,1,wx.ALIGN_CENTER)

        # 聊天框
        self.Chat_text = wx.TextCtrl(pl,size=(400,120),style=wx.TE_MULTILINE)
        box.Add(self.Chat_text,1,wx.ALIGN_CENTER)

        # 第二个网格布局
        fgz2 = wx.FlexGridSizer(wx.HSCROLL)

        # 创建两个按钮
        reset_btn = wx.Button(pl, size=(200, 40), label='重置')
        send_btn = wx.Button(pl, size=(200, 40), label='发送')

        # 将两个按钮放入网格布局中
        fgz2.Add(reset_btn, 1, wx.Top | wx.LEFT)
        fgz2.Add(send_btn, 1, wx.Top | wx.RIGHT)

        # fgz1放入box中
        box.Add(fgz2)
        pl.SetSizer(box)

        #为发送按钮绑定事件
        self.Bind(wx.EVT_BUTTON,self.send_to_server,send_btn)
        # 为断开连接的按钮绑定事件
        self.Bind(wx.EVT_BUTTON,self.dis_conn_to_server,dis_conn_btn)
        # 为重置按钮提供事件
        self.Bind(wx.EVT_BUTTON,self.reset_client,reset_btn)

        '''---------------服务器端的连接--------------'''
        self.Bind(wx.EVT_BUTTON,self.connect_to_server,conn_btn)
        self.client_name = name
        self.isConnect = False # 连接服务器的状态
        self.client_socket = None # 设置客户端的socket对象为空

    def reset_client(self,event):
        self.Chat_text.Clear()

    def dis_conn_to_server(self,event):
        self.client_socket.send('hhtpassword'.encode('utf-8'))
        self.isConnect =False
        # 直接关闭套接字
        self.client_socket.close()

    def send_to_server(self,event):
        # 是否连接状态
        if self.isConnect:
            # 获取聊天框的数据
            input_data = self.Chat_text.GetValue()
            if input_data!='':
                # 发送到服务器，服务器会将数据显示到各个客户端
                self.client_socket.send(input_data.encode('utf-8'))
                # 将输入框清空
                self.Chat_text.SetValue('')

    def connect_to_server(self,event):
        if self.isConnect:
            return
        # 创建套接字
        self.client_socket = socket.socket(AF_INET,SOCK_STREAM)
        # 试图连接
        server_host_port = ('127.0.0.1',8888)
        self.client_socket.connect(server_host_port)
        # 连接成功就发送一条数据
        self.client_socket.send(self.client_name.encode('utf-8'))
        # 启动一个线程与服务器的会话线程进行对话
        client_thread = threading.Thread(target=self.recv_data)
        # 设置守护线程
        client_thread.daemon = True
        #修改连接状态
        self.isConnect = True
        # 启动线程
        client_thread.start()
        print(f'客户端{self.client_name}已经连接成功')

    # 接受服务器的信息
    def recv_data(self):
        while self.isConnect:
            # 接受信息
            data = self.client_socket.recv(1024).decode('utf-8')
            # 显示到文本框中
            self.show_text.AppendText('-'*40+'\n'+data+'\n')
        self.client_socket.close()

if __name__ == '__main__':
    # 初始化App()
    app = wx.App()
    # 创建自己的客户端
    client = HhtClient('hht')
    client.Show()

    #响应式刷新
    app.MainLoop()